<?php
namespace AuthRule;
	/**
	 * 权限认证类
	 */
class AuthRule{
	//默认配置
	protected $_config = [
		'auth_on'           => true,              // 认证开关
		'auth_type'         => 1,                 // 认证用户类型
	];
	public function __construct($config=[]) {
		if ($config) {
			//可设置配置项 auth_config, 此配置项为数组。
			$this->_config = array_merge($this->_config, $config);
		}
	}
	/**
	 * 检查权限
	 * @param name string|array  需要验证的规则列表
	 * @param uid  int           认证用户的id
	 * @return boolean           通过验证返回true;失败返回false
	 */
	public function check($name, $uid) {
		if (!$this->_config['auth_on'])
			return true;
		$authList = $this->getAuthList($uid); //获取用户需要验证的所有有效规则列表
		if(in_array(strtolower($name),$authList)){
			return true;
		}
		return false;
	}

	/**
	 * 根据用户id获取用户组,返回值为数组
	 * @param  uid int     用户id
	 * @return array       用户所属的用户组
	 */
	public function getGroups($uid) {
		static $groups = [];
		if (isset($groups[$uid]))
			return $groups[$uid];
		$user_groups = db('auth_group_access')
			->alias('a')
			->join('auth_group b', 'b.ag_id=a.aga_group_id')
			->where(['aga_uid'=>$uid,'ag_status'=>1,'aga_type'=>$this->_config['auth_type']])
			->field('aga_uid,ag_title,ag_rules')->select();
		$groups[$uid] = $user_groups ? $user_groups : [];
		return $groups[$uid];
	}

	/**
	 * 获得权限列表
	 * @param integer $uid  用户id
	 */
	protected function getAuthList($uid) {
		static $_authList = []; //保存用户验证通过的权限列表
		//读取用户所属用户组
		$groups = $this->getGroups($uid);
		$ids = [];//保存用户所属用户组设置的所有权限规则id
		foreach ($groups as $g) {
			$ids = array_merge($ids, explode(',', trim($g['ag_rules'], ',')));
		}
		$where=[
			'ar_id'=>array('in',$ids),
			'ar_status'=>1,
		];
		//读取用户组所有权限规则
		$rules = db('auth_rule')->where($where)->field('ar_name')->select();
		//循环规则，判断结果。
		$authList = [];
		foreach ($rules as $rule) {
			$authList[] = strtolower($rule['ar_name']);
		}
		$_authList[$uid] = $authList;
		return array_unique($authList);
	}
}